// 应用层,不做任何协议的处理，只做流式的数据传输
#include "Socket.hpp"
#include <memory>
#include <functional>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

#include "threadpool_c++11.hpp"

using namespace SocketModule;
using namespace stlthreadpool;

using handler_t = std::function<void(std::string,std::shared_ptr<TcpSocket>)>;


class TcpServer
{
public:
    TcpServer(int port):
        _isRunning(false),
        _port(port),
        _tcsr(std::make_shared<TcpSocket>(port))
    {}
    void InitServer(handler_t handler)
    {
        _tcsr->BuildTcpSocket(_port);
        _handler = handler;
    }
    void Loop()
    {
        _isRunning = true;
        while(_isRunning)
        {
            SockAddr client;
            _tcsr->Accept(&client);
            // 这里的逻辑需要改变
            // 由于主线程会继续往下执行
            LOG(LogLevel::DEBUG) << "client info:" << client.getSockAddrInfo();
            
            // 采用多线程的方式
            // 这里我们要把任务封装好后推入线程池
            // threadpool::getInstance()->enterQueue(_handler,client);
            std::string request;
            _tcsr->Recv(&request);
            // note by hrj in 2025/1/21
            //这里我接受到了一个request的临时的对象,将临时的对象传递给线程吃的时候，可能会
            // 出现悬空引用的情况
            threadpool::getInstance()->enterQueue(_handler,request,_tcsr);
        }
    
    }
    void Stop()
    {
        _isRunning = false;
        threadpool::getInstance()->Stop();// 停止线程池

    }
private:
    bool _isRunning;
    std::shared_ptr<TcpSocket> _tcsr;
    uint16_t _port;
    handler_t _handler; // 通过http协议格式化处理字符串
};